from scipy.optimize import minimize
import numpy as np
#题目如下：
#   max x1*x2*x3
#   s.t. -x1+2*x2+2*x3>=0
#        x1+2*x2+2*x3<=72
#        10<=x2<=20
#        x1-x2=10

obj=lambda x: -x[0]*x[1]*x[2]
cons=[{'type':'ineq','fun':lambda x:-x[0]+2*x[1]+2*x[2]},
      {'type':'ineq','fun':lambda x:-x[0]-2*x[1]-2*x[2]+72},
      {'type':'eq','fun':lambda x:x[0]-x[1]-10}]
#注意约束条件：多个的时候采用中括号+大括号的形式套起来
#还有，不等式约束必须得换成“大于等于0”的形式，等式也必须写成0的形式
bd=[(-np.inf,np.inf) for i in range(1,4)]   # 生成决策向量界限的元组
ini=[22.59011067,12.59011067,12.11482322]#给定初值，采用蒙特卡洛的结果作为初始值
res=minimize(obj,ini,constraints=cons,bounds=bd)
print(res.fun)#最小值
print(res.success)#求解状态
print(res.x)#最小值对应自变量取值
#这道题只能求得局部最优解